home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
C/C++ Users Group Library 1996 July
/
C-C++ Users Group Library July 1996.iso
/
vol_200
/
235_01
/
ovhelp.c
< prev
next >
Wrap
Text File
|
1987-06-16
|
10KB
|
331 lines
/* 009 14-Feb-86 ovhelp.c
Copyright (c) 1986 by Blue Sky Software. All rights reserved.
*/
#include <stdio.h>
#include <setjmp.h>
#include "ov.h"
#define H_bar (0xcd)
#define HLINESIZ 80 /* max size of a help line - coordinate with cvthlp.c */
#define NSELS 20 /* max # menu ents/topic - coordinate with cvthlp.c */
#define STKSIZ 10 /* depth of prev screen stack */
static FILE *hlp;
static char *helpfile = "ov.hlp";
static char *nohelp = " - no help available!";
int help_exit(), help_back(), help_sel();
extern MENU *top_menu, top_help_menu[];
static MENU pmenu =
{ "Prev", "Return to the previous help screen", help_back, top_help_menu };
static MENU qmenu = { "Quit", "Quit help", help_exit, top_help_menu };
static int stkidx;
static char *buffer;
static MENU top_help_menu[NSELS];
static unsigned char save_restricted;
static long lastsel, offsets[NSELS], offstack[STKSIZ];
extern char *cantopen;
extern MENU_STATE curmenu;
extern jmp_buf back_to_main;
extern unsigned char restricted;
extern unsigned char help_display;
FILE *pathopen();
char *strchr(), *getenv(), *hgets();
/******************************************************************************
H E L P
*****************************************************************************/
help() { /* provide help on using OverView */
register int ch;
if (help_display) /* don't work recurrsively */
return;
help_init(); /* locate/open help file */
save_restricted = restricted; /* save current restricted flag and */
menu_save(); /* menu state before changing them */
restricted = TRUE; /* disable cmds we don't want */
help_display = TRUE; /* yes, help is active */
top_menu = top_help_menu; /* use (tbd) help menu */
savescreen(); /* save the current display screen */
savecursor(); /* save the current cursor state */
hidecursor(); /* force the cursor off */
help_on(0L); /* provide help with top screen */
disp_status(); /* don't tell user to hit F1 for help */
menu_init(); /* initialize help menu */
/* we do our own getchr() and menu selections here because we don't
know what might have been going on before help was called - if
we returned to the caller, things might get screwed up */
while (help_display && (ch = getchr()) != EOF_CH) {
switch(ch) {
case ' ': case 9: /* advance the menu selection pointer */
menu_advance();
break;
case 8: /* backup the menu selection pointer */
menu_backup();
break;
case RETURN: /* CR - do current menu selection */
menu_do_current();
break;
case 27: /* escape - return to top menu */
menu_init(); /* reset the menu subsystem */
break;
default: /* see if the 1st letter of selection */
menu_do_char(ch); /* do menu selection starting with ch */
break;
}
}
if (help_display)
help_exit(); /* in case user ^Z's out */
}
/****************************************************************************
H E L P _ I N I T
****************************************************************************/
static int
help_init() { /* initialize the help subsystem */
stkidx = 0; /* make sure stack of offsets is empty */
lastsel = 0; /* there was no last help topic selection */
/* try to open the default help file somewhere in the PATH -
give up if helpfile doesn't open */
if ((hlp = pathopen(helpfile,"rb")) == NULL)
show_error(0,15,3,cantopen,helpfile,nohelp);
/* try to allocate a large buffer to access the help file */
if (buffer = (char *) malloc(4096))
setvbuf(hlp,buffer,_IOFBF,4096);
}
/*****************************************************************************
H E L P _ E X I T
*****************************************************************************/
static int
help_exit() { /* exit from help subsystem */
fclose(hlp); /* close the help file */
if (buffer) /* release buffer if used */
free(buffer);
menu_restore(); /* restore prior menu */
help_display = FALSE; /* help is signing off for now */
restricted = save_restricted; /* restore prior restricted flag */
purge_menu(); /* free strings used by menu */
restorescreen(); /* restore the prior display screen */
restorecursor(); /* restore the previous cursor state */
}
/****************************************************************************
H E L P _ O N
****************************************************************************/
static int
help_on(offset) /* provide help on selected topic */
long offset;
{
char *title, hline[HLINESIZ+1];
*hline = 'X'; /* error flag */
if (fseek(hlp,offset,SEEK_SET) == 0) /* seek to the help frame */
hgets(hline); /* get the header line */
if (*hline != '#') { /* header lines start with # */
show_error(0,0,2,"Error reading help file",nohelp);
help_exit();
longjmp(16,back_to_main); /* should never happen, but... */
}
/* display the topic title at top of screen */
title = strchr(hline,' ');
center_text(FIRST_HROW-1,title ? title+1 : hline+1);
help_menu(hline,offset == 0); /* create menu */
help_text(hline); /* display text */
}
/****************************************************************************
H E L P _ T E X T
****************************************************************************/
static int
help_text(buf) /* display help text */
char *buf;
{
register int i, ntext;
ntext = fgetc(hlp); /* read # text lines */
for (i = 0; i < HELP_ROWS; i++) {
gotorc(i+FIRST_HROW,0);
if (ntext)
if (hgets(buf)) {
disp_str(buf);
ntext--;
} else
ntext = 0;
clr_eol();
}
}
/****************************************************************************
H E L P _ M E N U
****************************************************************************/
static int
help_menu(buf,top) /* build a menu_selection structure for selection */
char *buf;
int top;
{
int i;
char *bp;
register MENU *mp;
register int nmenu;
purge_menu(); /* clear out last menu */
mp = top_help_menu;
/* process each menu entry in the help file */
for (nmenu = fgetc(hlp), i = 0; nmenu > 0; nmenu--, mp++) {
fread(&offsets[i++],sizeof(long),1,hlp); /* read the ent's offset */
hgets(buf); /* read keyword/prompt */
/* build menu selection for this entry */
if (bp = strchr(buf,' ')) {
mp->choice = Strndup(buf,bp-buf);
mp->prompt = Strdup(bp+1);
mp->func = help_sel;
mp->sub_menu = top_help_menu;
} else {
i--; /* shouldn't happen */
mp--;
}
}
/* assign the two constant entries and finish it */
if (!top) /* don't include Prev entry if */
*mp++